package com.springboot.jdk.concurrency;

import java.util.LinkedList;

/**
 * @author: zr
 * @date: 2021-09-25
 */
public class MyQueue {

    public static final int MAX_SIZE = 100;

    private LinkedList<String> queue = new LinkedList<String>();

    public synchronized String take() {
        // 别的线程就可以从这里从队列里take数据

        try {

            if (queue.size() == 0) {
                // 方法执行到了这里，说明当前已经获取到了这把锁，其他线程不能获取这把锁
                // 但是当从队列里面获取数据的时候，如果队列里面的数据为空
                // 此时可以释放这把锁，线程进入等待状态，等待其他线程获取锁，并放入数据到队列中
                wait();
            }

            // 从队列里面拿掉了一个数据，队列就有剩余空间，可以子继续往队列里面添加数据
            String result = queue.getFirst();
            // 唤醒当前正在等待这个锁的线程
            notifyAll();
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }


    }

    public synchronized void offer(String element) {
        // 往队列里面方元素，判断一下，队列的最大大小是否已经是max_zise
        // 如果队列元素大小已经是max_zis了，
        try {
            if (queue.size() == MAX_SIZE) {
                // 一个线程只要执行到了这一步，说明已经获取到了一把锁
                // 但是队列里面数据已经满了，不能继续往queue里面塞数据了，但是线程已经获取锁了
                // 此时可以使用wait，让线程进入一个等待状态，释放掉锁，等待其他线程唤醒
                wait();
            }

            queue.addLast(element);
            // 队列里面添加了一个数据，此时也应该执行以下notifyall
            // 唤醒 当前 正在等待 获取锁的线程，通知其他线程可以去获取锁，从队列里面获取数据
            notifyAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
